#ifndef XXK_PSGPIO_H
#define XXK_PSGPIO_H

// 包含xilinx库中头文件
#include "xil_printf.h"
#include "xgpiops.h"
#include "xscugic.h"
#include "xil_exception.h"

// 包含Xxk库中的头文件
#include "..\XXK.h"
#include "..\IRQ.h"
#include "Xxk_ZYNQ_MioAndEmio_Pins.h"

// 与PS GPIO相关的宏定义
// GPIO指的就是PS侧的GPIO硬核，对于ZYNQ7，只有一个GPIO硬核
#define PSGPIO_INPUT  0U
#define PSGPIO_OUTPUT 1U
#define PSGPIO_OUTPUT_ENABLE  1U
#define PSGPIO_OUTPUT_DISABLE 0U

/* 中断类型，已在xgpiops.h中定义，放在这里方便找到
#define XGPIOPS_IRQ_TYPE_EDGE_RISING	0x00U
#define XGPIOPS_IRQ_TYPE_EDGE_FALLING	0x01U
#define XGPIOPS_IRQ_TYPE_EDGE_BOTH	    0x02U
#define XGPIOPS_IRQ_TYPE_LEVEL_HIGH	    0x03U
#define XGPIOPS_IRQ_TYPE_LEVEL_LOW	    0x04U
*/


// 全局变量
extern XGpioPs psGpio;



// PS GPIO相关函数
// 初始化psGpio
int psGpioInti(XGpioPs *psGpioPtr, u16 psGpio_deviceId);
//psGpioInti(&psGpio, XPAR_XGPIOPS_0_DEVICE_ID);



// 设置psGpio某引脚为输出并使能
void psGpio_SetPinOutputAndEnbale(const XGpioPs *psGpioPtr, u32 Pin);
//psGpio_SetPinOutputAndEnbale(&psGpio, EMIO0);

// 设置psGpio某引脚为输入，输入无需使能
void psGpio_SetPinInput(const XGpioPs *psGpioPtr, u32 Pin);
//psGpio_SetPinInput(&psGpio, EMIO0);


// 向psGpio某引脚写入0或1
extern void XGpioPs_WritePin(const XGpioPs *psGpioPtr, u32 Pin, u32 Data);
//XGpioPs_WritePin(&psGpio, EMIO0, 1);

// 读取psGpio某引脚的电平，得到0或1
extern u32 XGpioPs_ReadPin(const XGpioPs *psGpioPtr, u32 Pin);
//EMIO0_pinData = XGpioPs_ReadPin(&psGpio, EMIO0);



// 中断相关函数
void psGpio_PinIntr_SetAndEnable(XScuGic *scuGicPtr, XGpioPs *psGpioPtr, u32 psGpio_intrId,
							     Xil_ExceptionHandler psGpio_Handler, u32 Pin, u8 IrqType);
//psGpio_PinIntr_SetAndEnable(&scuGic, &psGpio, XPAR_XGPIOPS_0_INTR,
//                            psGpio_Handler, EMIO0, XGPIOPS_IRQ_TYPE_EDGE_RISING);


void psGpio_Handler(void *CallBackRef);



#endif
